const db = require("../db/index"); // 数据库处理模块
const bcrypt = require("bcryptjs"); // 密码加密，解密模块
const jwt = require("jsonwebtoken"); // 导入生成token的包
const config = require("../config"); // 导入token配置文件
// 管理员注册的处理函数
exports.regworker = (req, res) => {
  let userinfo = req.body;
  let referSql = `SELECT * from workerinfo WHERE BINARY username = '${userinfo.nm}' OR userAcc = '${userinfo.acc}'`; // 判断用户名和手机号是否已经存在
  let reqSql = `INSERT INTO workerinfo SET ?`; // 向用户表添加新用户

  // 判断用户名和手机号是否已经存在
  db.query(referSql, (err, data) => {
    if (err) return res.send(err);
    if (data[0]?.username == userinfo.nm) {
      return res.send({ code: 400, message: "该昵称已被注册" });
    } else if (data[0]?.userAcc == userinfo.acc) {
      return res.send({ code: 400, message: "该手机号已被注册" });
    } else {
      // 随机生成一个用户的ID
      let rdmNum = "";
      for (let i = 0; i < 9; i++) {
        rdmNum += Math.floor(Math.random() * 10); // [0,10)的整数
      }
      let refIdSql = `SELECT * from workerinfo WHERE id = ${rdmNum}`; // 查询ID是否存在
      // 查询ID是否已经存在
      db.query(refIdSql, (err, data) => {
        if (err) return res.send(err);
        if (data.length > 0) {
          for (let i = 0; i < 20; i++) {
            rdmNum += Math.floor(Math.random() * 10); // [0,10)的整数
          }
        }
      });
      // 对密码进行加密
      userinfo.pwd = bcrypt.hashSync(userinfo.pwd, 10);
      // 获取用户输入的信息
      let userObj = {
        id: rdmNum,
        username: userinfo.nm,
        userAcc: userinfo.acc,
        password: userinfo.pwd,
        userPic: "",
      };
      db.query(reqSql, userObj, (err, data) => {
        if (err) return res.send(err);
        // 判断注册是否成功
        if (data.affectedRows !== 1) {
          return res.send({
            code: 500,
            message: "注册失败，请稍后再试！",
          });
        }
        res.send({
          code: 200,
          message: "注册成功",
        });
      });
    }
  });
};

// 管理员登录的处理函数
exports.workerLogin = (req, res) => {
  let dlSql = `SELECT * FROM workerinfo WHERE userAcc = ${req.body.acc}`;
  db.query(dlSql, (err, data) => {
    if (err) return res.send(err);
    // 判断查询的手机号是否存在
    if (data.length !== 1) {
      return res.send({ code: 400, message: "该手机号尚未注册" });
    }
    // 对密码进行解密判断
    const verifyPwd = bcrypt.compareSync(req.body.pwd, data[0].password);
    if (!verifyPwd) {
      return res.send({ code: 400, message: "密码输入错误" });
    }
    // 将id,密码剔除后返回
    const user = { ...data[0], password: "", userPic: "" };
    // 对用户的信息进行加密，生成token字符串
    const tokenStr = jwt.sign(user, config.jwtSecretKey, {
      expiresIn: req.body.tokenTime,
    });
    // 将生成的token字符串添加到用户的数据中
    data[0].token = "Bearer " + tokenStr;
    data[0].password = "";
    res.send({
      code: 200,
      message: "登录成功",
      data,
    });
  });
};

// 管理员注销的处理函数
exports.workerLogout = (req, res) => {
  let sql = `DELETE FROM workerinfo where id = ${req.body.id}`;
  db.query(sql, (err, data) => {
    if (err) return res.send(err);
    if (data.affectedRows !== 1) {
      return res.send({ code: 500, message: "注销用户失败，请重新尝试" });
    }
    res.send({
      code: 200,
      message: "注销用户成功",
    });
  });
};

// 管理员重置密码的处理函数
exports.workerUpdatePassword = (req, res) => {
  let sql = `select * from workerinfo where id = ${req.body.id}`; // 查询是否存在修改密码的用户
  let upSql = `update workerinfo set password = ? where id = ${req.body.id}`; // 重置当前用户的密码
  db.query(sql, (err, data) => {
    if (err) return res.send(err);
    if (data.length !== 1) return res.send("用户不存在");
    // 对密码进行解密判断
    const compareResult = bcrypt.compareSync(req.body.oldPwd, data[0].password);
    if (!compareResult) {
      return res.send({ code: 400, message: "旧密码错误" });
    }
    // 对密码进行加密
    let newPwd = bcrypt.hashSync(req.body.newPwd, 10);
    // 重置密码
    db.query(upSql, newPwd, (err, data) => {
      if (err) return res.send(err);
      if (data.affectedRows !== 1) {
        return res.send({ code: 502, message: "重置密码失败" });
      }
      res.send({ code: 200, message: "重置密码成功" });
    });
  });
};

// 管理员修改资料的处理函数
exports.alterData = (req, res) => {
  const sql = `update workerinfo set username='${req.body.nm}', userAcc='${req.body.acc}', userPic='${req.body.pic}' where id = ${req.body.id}`;
  db.query(sql, (err, data) => {
    if (err) return res.send(err);
    if (data.affectedRows !== 1) {
      return res.send({ code: 502, message: "修改资料失败" });
    }
    let userInfo = {
      username: req.body.nm,
      userAcc: req.body.acc,
      userPic: req.body.pic,
    };
    res.send({ code: 200, message: "修改资料成功", userInfo });
  });
};
